/**
 开发团队 :
 开发人员 : ZBB295
 开发时间 : 2022/8/12 18:26
 文件名称 : user.js
 开发工具 : WebStorm
 */


//引入mongoose第三方模块
const mongoose = require('mongoose');
//引入密码加密模块
const bcryptjs = require('bcryptjs')
//引入Joi模块
const joi = require('joi')

//创建用户集合规则
const userSchema = new mongoose.Schema({
    username:{
        type:String,
        required:true,
        minlength:2,
        maxlength:20
    },
    email:{
        type:String,
        //保证邮箱地址在插入数据时候不重复
        unique:true,
        required:true
    },
    password:{
        type:String,
        required:true
    },
    //admin 超级管理员
    //normal 普通管理员
    role:{
        type:String,
        required:String
    },
    //0为启用状态
    //1为禁用状态
    state:{
        type:Number,
        default:0
    }
})

//创建User集合 并且返回这个集合的构造函数，可以用这个构造函数对这个集合进行各种操作
const User = mongoose.model('User',userSchema)
// const pass = bcryptjs.hashSync('123456',10);

//测试代码
//     User.create({
//     username:'itheima',
//     email:'itheima@itcast.cn',
//     password:pass,
//     role:'admin',
//     state:0
// }).then(()=>{
//     console.log('用户创建成功')
// }).catch(()=>{
//     console.log('用户创建失败')
//     })

const  validateUser = (user)=>{
    //定义对象的验证规则
    const schema =joi.object({
        username:joi.string().min(2).max(12).required().error(new Error('用户名不符合要求')),
        email:joi.string().email().required().error(new Error('邮箱格式不符合要求')),
        password:joi.string().regex(/^[a-zA-Z0-9]{3,30}$/).required().error(new Error('密码格式不符合要求')),
        role:joi.string().valid('normal','admin').required().error(new Error('角色值不符合要求')),
        state:joi.number().valid(0,1).required().error(new Error('状态值不符合要求'))
    });
    // 实施验证
    return schema.validateAsync(user);
}


//将用户集合作为模块成员进行导出，没有直接导出User是因为可能以后还要导出别的所以这里写成了对象形式
module.exports = {
    //在es6语法中对象的键和值名称一样可以省略掉值，下面是等价的
    // User:User
    User,
    validateUser
}
